函式的回傳值 (return value)
我們使用函式參數將資料傳入函式。而當函式想要回傳結果時,有兩條途徑:
在函式內改變參數的值來回傳結果。
如前篇文章說明, 如果 C 函式使用指標 (Pointers) 傳遞參數,或 Python 函式參數使用可變動型態物件,則當函式內對參數進行的任何改變,都會影響函式外的原來變數內容。
不過,使用這種方式要小心,避免意外錯誤或副作用的產生。
使用關鍵字 return
回傳結果。
如果回傳的資料量不是很大,通常都會使用這個 return
途徑。
在 C 程式碼:
需要在函式的前頭宣告回傳類型 (例如 int),如果沒有回傳值,就要宣告為 void
。
如果想要回傳多個值,回傳類型可以考慮使用結構 (Struct)。
這是 C函式的回傳類型範例:
int retDouble(int x) {
int a;
a = x * 2;
return a; // **回傳**類型: int
}
typedef struct {
int add;
int minus;
} AddAndMinus;
AddAndMinus add_minus_func(int x, int y) {
AddAndMinus result;
result.add = x + y;
result.minus = x - y;
return result; // **回傳**類型: 結構 (Struct)
}
int main() {
int retVal = retDouble(8);
printf("回傳值: %d\n", retVal);
AddAndMinus result = add_minus_func(8, 3);
printf("相加: %d\n", result.add);
printf("相減: %d\n", result.minus);
return 0;
}
在 Python 程式碼:
return
回傳結果,它會自動回傳 None
這是 Python 函式的回傳類型範例:
def ret_double(x):
return x * 2 # 回傳類型和參數x 一樣
def add_minus_func(x, y):
return x + y, x - y # 回傳類型是元組 tuple
ret_val = ret_double(8);
print(f"回傳值: {ret_val }") # 回傳值: 16
result = add_minus_func(8, 3)
print(result) # (11, 5)
print(type(result)) # <class 'tuple'>
ret_add, ret_minus = add_minus_func(8, 3) # unpack the tuple to variables
print(f"相加: {ret_add}, 相減: {ret_minus}") # 相加: 11, 相減: 5
Python 函式的進階說明
這裡只是簡單介紹 Python 函式的進階功能,沒有提供完整的語法定義、詳細使用細節與應用。主要是讓我們了解 Python函式和 C函式的差異。
類型提示 (Type Hints):
前面有提到 Python 不需要指定函式的回傳類型,雖然這樣的設計很自由,但有時候無法讓我們快速判斷某一函式的回傳類型。
所以從 Python 3.5 開始能夠將程式碼加上類型註釋 (Type Annotation) ,讓程式更容易閱讀。注意,這只是註釋,並沒有限定程式碼使用類型種類。
def add_typing(num_x: int, num_y: int=10) -> int:
sum = num_x + num_y
return sum
巢狀函式 (Nested Function) :
在Python 函式內還可以定義函式,叫做 巢狀函式(Nested Function) 也稱為 內部函式(inner function),
巢狀函式的主要用處:能直接存取外部函式之參數,或者先前宣告之區域變數,如此可減少呼叫函式時引數的傳遞。並且可以建立在呼叫之間的保留狀態 (類似 C 函式內 static
, 在下篇文章說明)。
def outer_func(a, b):
num = 3
def inner_func(): # 巢狀函式 或 內部函式
nonlocal num # 存取外部函式的區域變數
num += 2
print(a, b) # 可讀取 外部函式的參數
return num
return inner_func
匿名函式 (Lambda Function)
lambda
取代 def
return
def add_func(x, y):
return x+y
b = lambda x, y: x+y # 匿名函式